home *** CD-ROM | disk | FTP | other *** search
/ Apple Developer Connection 1998 Fall: Game Toolkit / Disc.iso / SDKs / Apple Game Sprockets / SoundSprocket / SoundSprocketTest Sources / TS3TestHiLevel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-26  |  65.1 KB  |  2,515 lines  |  [TEXT/CWIE]

  1. /*
  2.  *    File:        TS3TestHiLevel.c
  3.  *
  4.  *    Copyright © 1996 Apple Computer, Inc.
  5.  */
  6.  
  7. #include <assert.h>
  8. #include <math.h>
  9. #include <string.h>
  10.  
  11. #include <Dialogs.h>
  12. #include <Fonts.h>
  13. #include <Menus.h>
  14. #include <Timer.h>
  15.  
  16. #include <QD3D.h>
  17. #include <QD3DMath.h>
  18.  
  19. #include "TS3Menu.h"
  20. #include "TS3Message.h"
  21. #include "TS3Resource.h"
  22. #include "TS3Sound.h"
  23. #include "TS3TestHiLevel.h"
  24. #include "TS3Utils.h"
  25. #include "TS3Window.h"
  26.  
  27. #include "SoundSprocket.h"
  28.  
  29.  
  30. typedef struct TTestHiLevelData {
  31.     float            duration;
  32.     
  33.     TQ3Vector3D        listenerTranslate1;
  34.     TQ3Vector3D        listenerTranslate2;
  35.     Boolean            listenerTranslateRange;
  36.     
  37.     TQ3Vector3D        listenerRotationAxis1;
  38.     TQ3Vector3D        listenerRotationAxis2;
  39.     Boolean            listenerRotationAxisRange;
  40.     
  41.     float            listenerRotationAngle1;
  42.     float            listenerRotationAngle2;
  43.     Boolean            listenerRotationAngleRange;
  44.     
  45.     TQ3Vector3D        listenerScale1;
  46.     TQ3Vector3D        listenerScale2;
  47.     Boolean            listenerScaleRange;
  48.     
  49.     TQ3Vector3D        listenerPosition1;
  50.     TQ3Vector3D        listenerPosition2;
  51.     Boolean            listenerPositionRange;
  52.     
  53.     TQ3Vector3D        listenerOrientation1;
  54.     TQ3Vector3D        listenerOrientation2;
  55.     Boolean            listenerOrientationRange;
  56.     
  57.     TQ3Vector3D        listenerUpVector1;
  58.     TQ3Vector3D        listenerUpVector2;
  59.     Boolean            listenerUpVectorRange;
  60.     
  61.     TQ3Vector3D        listenerVelocity1;
  62.     TQ3Vector3D        listenerVelocity2;
  63.     Boolean            listenerVelocityRange;
  64.     
  65.     UInt32            medium;
  66.     
  67.     float            humidity1;
  68.     float            humidity2;
  69.     Boolean            humidityRange;
  70.     
  71.     float            roomSize1;
  72.     float            roomSize2;
  73.     Boolean            roomSizeRange;
  74.     
  75.     float            roomReflectivity1;
  76.     float            roomReflectivity2;
  77.     Boolean            roomReflectivityRange;
  78.     
  79.     float            reverbAttenuation1;
  80.     float            reverbAttenuation2;
  81.     Boolean            reverbAttenuationRange;
  82.     
  83.     UInt32            cpuLoad1;
  84.     UInt32            cpuLoad2;
  85.     Boolean            cpuLoadRange;
  86.     
  87.     TQ3Vector3D        sourceTranslate1;
  88.     TQ3Vector3D        sourceTranslate2;
  89.     Boolean            sourceTranslateRange;
  90.     
  91.     TQ3Vector3D        sourceRotationAxis1;
  92.     TQ3Vector3D        sourceRotationAxis2;
  93.     Boolean            sourceRotationAxisRange;
  94.     
  95.     float            sourceRotationAngle1;
  96.     float            sourceRotationAngle2;
  97.     Boolean            sourceRotationAngleRange;
  98.     
  99.     TQ3Vector3D        sourceScale1;
  100.     TQ3Vector3D        sourceScale2;
  101.     Boolean            sourceScaleRange;
  102.     
  103.     TQ3Vector3D        sourcePosition1;
  104.     TQ3Vector3D        sourcePosition2;
  105.     Boolean            sourcePositionRange;
  106.     
  107.     TQ3Vector3D        sourceOrientation1;
  108.     TQ3Vector3D        sourceOrientation2;
  109.     Boolean            sourceOrientationRange;
  110.     
  111.     TQ3Vector3D        sourceUpVector1;
  112.     TQ3Vector3D        sourceUpVector2;
  113.     Boolean            sourceUpVectorRange;
  114.     
  115.     TQ3Vector3D        sourceVelocity1;
  116.     TQ3Vector3D        sourceVelocity2;
  117.     Boolean            sourceVelocityRange;
  118.     
  119.     UInt32            sourceMode;
  120.     
  121.     float            referenceDistance1;
  122.     float            referenceDistance2;
  123.     Boolean            referenceDistanceRange;
  124.     
  125.     float            length1;
  126.     float            length2;
  127.     Boolean            lengthRange;
  128.     
  129.     float            width1;
  130.     float            width2;
  131.     Boolean            widthRange;
  132.     
  133.     float            height1;
  134.     float            height2;
  135.     Boolean            heightRange;
  136.     
  137.     float            coneAngleDeg1;
  138.     float            coneAngleDeg2;
  139.     Boolean            coneAngleDegRange;
  140.     
  141.     float            coneAttenuation1;
  142.     float            coneAttenuation2;
  143.     Boolean            coneAttenuationRange;
  144.     
  145.     float            coneAngleCos1;
  146.     float            coneAngleCos2;
  147. } TTestHiLevelData;
  148.  
  149.  
  150. static MenuHandle                gTestHiLevelPresetMenu            = NULL;
  151. static DialogPtr                gTestHiLevelDialog                = NULL;
  152. static UserItemUPP                gTestHiLevelProgressUserItem    = NULL;
  153. static UInt32                    gTestHiLevelCPULoadLimit;
  154. static TTestHiLevelData            gTestHiLevelData;
  155. static Boolean                    gTestHiLevelUpdate                = true;
  156. static SSpListenerReference        gTestHiLevelListener            = NULL;
  157. static SSpSourceReference        gTestHiLevelSource                = NULL;
  158.  
  159. static UnsignedWide                gTestHiLevelCycleStart;
  160. static float                    gTestHiLevelInterpolant            = 0.0;
  161.  
  162. static TQ3Vector3D                gTestHiLevelListenerActual        = {-1.23456, -1.23456, -1.23456};
  163. static TQ3Vector3D                gTestHiLevelSourceActual        = {-1.23456, -1.23456, -1.23456};
  164.  
  165.  
  166. static WindowMethodPtr TestHiLevel_MetaHandler(
  167.     WindowMethod        inMethod);
  168.  
  169. static void TestHiLevel_GetSleep(
  170.     WindowPtr            inWindow,
  171.     UInt32*                outSleep);
  172.  
  173. static void TestHiLevel_ConsumeEvent(
  174.     WindowPtr            inWindow,
  175.     const EventRecord*    inEvent,
  176.     Boolean*            outConsumed);
  177.  
  178. static void TestHiLevel_Update(
  179.     WindowPtr            inWindow);
  180.  
  181. static void TestHiLevel_Activate(
  182.     WindowPtr            inWindow);
  183.  
  184. static void TestHiLevel_Deactivate(
  185.     WindowPtr            inWindow);
  186.  
  187. static pascal void TestHiLevel_ProgressUserItem(
  188.     DialogPtr            inDialog,
  189.     short                inItem);
  190.  
  191. static void TestHiLevel_Interpolate(
  192.     void);
  193.  
  194. static float TestHiLevel_InterpolateFloat(
  195.     float                inWhere,
  196.     float                inVal0,
  197.     float                inVal1,
  198.     Boolean                inIsRange);
  199.  
  200. static void TestHiLevel_InterpolateVector3D(
  201.     float                inWhere,
  202.     const TQ3Vector3D*    inVal0,
  203.     const TQ3Vector3D*    inVal1,
  204.     Boolean                inIsRange,
  205.     TQ3Vector3D*        outResult);
  206.  
  207. static void TestHiLevel_InterpolateNormalVector3D(
  208.     float                inWhere,
  209.     const TQ3Vector3D*    inVal0,
  210.     const TQ3Vector3D*    inVal1,
  211.     Boolean                inIsRange,
  212.     TQ3Vector3D*        outResult);
  213.  
  214. static void TestHiLevel_DeriveData(
  215.     void);
  216.  
  217. static void TestHiLevel_SetDialogFields(
  218.     void);
  219.  
  220. static void TestHiLevel_GetDialogFields(
  221.     void);
  222.  
  223.  
  224. /* =============================================================================
  225.  *        TestHiLevel_Init (external)
  226.  *
  227.  *    Initializes our thing.
  228.  * ========================================================================== */
  229. void TestHiLevel_Init(
  230.     void)
  231. {
  232.     OSStatus            err;
  233.     TEHandle            textEdit;
  234.     FontInfo            fontInfo;
  235.     short                itemType;
  236.     Handle                itemHandle;
  237.     Rect                itemBounds;
  238.     Str255                str;
  239.     
  240.     // Make sure we didn't mess up the dialog items
  241.     assert(kHiLevelItem_COUNT == kHiLevelItem_ExpectedCOUNT);
  242.     
  243.     // Grab the maximum CPU load limit value
  244.     gTestHiLevelCPULoadLimit = 999;
  245.     err = SSpGetCPULoadLimit(&gTestHiLevelCPULoadLimit);
  246.     Message_CheckError(err, "TestHiLevel_Init", "SSpGetCPULoadLimit");
  247.     
  248.     //• TODO: Read in gTestHiLevelData from preferences
  249.     
  250.     // Set up our listener and source
  251.     err = SSpListener_New(&gTestHiLevelListener);
  252.     Message_CheckError(err, "TestHiLevel_Init", "SSpListener_New");
  253.     
  254.     assert(gTestHiLevelListener != NULL);
  255.     
  256.     err = SSpSource_New(&gTestHiLevelSource);
  257.     Message_CheckError(err, "TestHiLevel_Init", "SSpSource_New");
  258.     
  259.     assert(gTestHiLevelSource != NULL);
  260.     
  261.     // Grab the menu
  262.     gTestHiLevelPresetMenu = GetMenu(kMenuID_HiLevelPreset);
  263.     
  264.     // Grab the dialog
  265.     gTestHiLevelDialog = GetNewDialog(kDlogID_HiLevel, NULL, (WindowPtr) -1);
  266.     assert(gTestHiLevelDialog != NULL);
  267.     
  268.     SetPort(gTestHiLevelDialog);
  269.     TextFont(geneva);
  270.     TextSize(10);
  271.     
  272.     // Fix up the line height
  273.     GetFontInfo(&fontInfo);
  274.     
  275.     textEdit = ((DialogPeek) gTestHiLevelDialog)->textH;
  276.     
  277.     (*textEdit)->lineHeight = fontInfo.ascent+fontInfo.descent+fontInfo.leading;
  278.     (*textEdit)->fontAscent = fontInfo.ascent;
  279.     
  280.     // Set up our method table
  281.     Window_New(gTestHiLevelDialog, TestHiLevel_MetaHandler);
  282.     
  283.     // Do the user items
  284.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, &itemType, &itemHandle, &itemBounds);
  285.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_UpdateHilite, itemType, (Handle) Utils_GetOKUserItemProc(), &itemBounds);
  286.     
  287.     gTestHiLevelProgressUserItem = NewUserItemProc(TestHiLevel_ProgressUserItem);
  288.     assert(gTestHiLevelProgressUserItem != NULL);
  289.     
  290.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, &itemType, &itemHandle, &itemBounds);
  291.     SetDialogItem(gTestHiLevelDialog, kHiLevelItem_Progress, itemType, (Handle) gTestHiLevelProgressUserItem, &itemBounds);
  292.     
  293.     // Show the quality limit
  294.     sprintf((char*) str, "x[0..%ld]", gTestHiLevelCPULoadLimit);
  295.     str[0] = strlen((char*) str)-1;
  296.     
  297.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_CPULoadUnits, &itemType, &itemHandle, &itemBounds);
  298.     SetDialogItemText(itemHandle, str);
  299.     
  300.     // Set the initial field values
  301.     TestHiLevel_Preset(1);
  302.     
  303.     // Select the first field
  304.     SelectDialogItemText(gTestHiLevelDialog, kHiLevelItem_Duration, 0, 32767);
  305.     
  306.     // Show the dialog
  307.     ShowWindow(gTestHiLevelDialog);
  308.     
  309.     // Initialize our cycle timer
  310.     Microseconds(&gTestHiLevelCycleStart);
  311. }
  312.  
  313.  
  314. /* =============================================================================
  315.  *        TestHiLevel_Exit (external)
  316.  *
  317.  *    Cleans up.
  318.  * ========================================================================== */
  319. void TestHiLevel_Exit(
  320.     void)
  321. {
  322.     //• TODO: Save gTestHiLevel to preferences
  323.     
  324.     if (gTestHiLevelDialog != NULL)
  325.     {
  326.         DisposeDialog(gTestHiLevelDialog);
  327.         gTestHiLevelDialog = NULL;
  328.     }
  329.     
  330.     if (gTestHiLevelProgressUserItem != NULL)
  331.     {
  332.         DisposeRoutineDescriptor(gTestHiLevelProgressUserItem);
  333.         gTestHiLevelProgressUserItem = NULL;
  334.     }
  335.     
  336.     if (gTestHiLevelListener != NULL)
  337.     {
  338.         SSpListener_Dispose(gTestHiLevelListener);
  339.         gTestHiLevelListener = NULL;
  340.     }
  341.     
  342.     if (gTestHiLevelSource != NULL)
  343.     {
  344.         SSpSource_Dispose(gTestHiLevelSource);
  345.         gTestHiLevelSource = NULL;
  346.     }
  347. }
  348.  
  349.  
  350. /* =============================================================================
  351.  *        TestHiLevel_MetaHandler (internal)
  352.  *
  353.  *    Returns the method function pointer that corresponds to the given ID.
  354.  * ========================================================================== */
  355. WindowMethodPtr TestHiLevel_MetaHandler(
  356.     WindowMethod        inMethod)
  357. {
  358.     WindowMethodPtr        result;
  359.     
  360.     result = NULL;
  361.     
  362.     switch (inMethod)
  363.     {
  364.         case kWindowMethod_GetSleep:
  365.             result = (WindowMethodPtr) TestHiLevel_GetSleep;
  366.         break;
  367.         
  368.         case kWindowMethod_ConsumeEvent:
  369.             result = (WindowMethodPtr) TestHiLevel_ConsumeEvent;
  370.         break;
  371.         
  372.         case kWindowMethod_Update:
  373.             result = (WindowMethodPtr) TestHiLevel_Update;
  374.         break;
  375.         
  376.         case kWindowMethod_Activate:
  377.             result = (WindowMethodPtr) TestHiLevel_Activate;
  378.         break;
  379.         
  380.         case kWindowMethod_Deactivate:
  381.             result = (WindowMethodPtr) TestHiLevel_Deactivate;
  382.         break;
  383.     }
  384.     
  385.     return result;
  386. }
  387.  
  388.  
  389. /* =============================================================================
  390.  *        TestHiLevel_GetSleep (internal)
  391.  *
  392.  *    Returns the sleep time to pass to WaitNextEvent when we're in front.
  393.  * ========================================================================== */
  394. void TestHiLevel_GetSleep(
  395.     WindowPtr            inWindow,
  396.     UInt32*                outSleep)
  397. {
  398.     assert(outSleep != NULL);
  399.     
  400.     *outSleep = 0;
  401. }
  402.  
  403.  
  404. /* =============================================================================
  405.  *        TestHiLevel_ConsumeEvent (internal)
  406.  *
  407.  *    Called for each event when this is the front window.
  408.  * ========================================================================== */
  409. void TestHiLevel_ConsumeEvent(
  410.     WindowPtr            inWindow,
  411.     const EventRecord*    inEvent,
  412.     Boolean*            outConsumed)
  413. {
  414.     short                itemType;
  415.     Handle                itemHandle;
  416.     Rect                itemBounds;
  417.     ControlHandle        updateButton;
  418.     Boolean                consumed;
  419.     Boolean                passToDialog;
  420.     WindowPtr            window;
  421.     short                item;
  422.     unsigned long        timeout;
  423.     UnsignedWide        now;
  424.     
  425.     assert(inEvent != NULL);
  426.     assert(outConsumed != NULL);
  427.     
  428.     consumed = false;
  429.     passToDialog = true;
  430.     
  431.     // We want to handle some events ourself
  432.     switch (inEvent->what)
  433.     {
  434.         case keyDown:
  435.         case autoKey:
  436.             passToDialog = false;
  437.             
  438.             if (inEvent->modifiers & cmdKey)
  439.             {
  440.                 if (inEvent->what != autoKey)
  441.                 {
  442.                     switch (inEvent->message & charCodeMask)
  443.                     {
  444.                         case '.':
  445.                             // anything here?
  446.                         break;
  447.                     }
  448.                 }
  449.             }
  450.             else
  451.             {
  452.                 switch (inEvent->message & charCodeMask)
  453.                 {
  454.                     case 0x08:  // backspace
  455.                     case 0x09:  // tab
  456.                     case 0x1C:  // cursor left
  457.                     case 0x1D:  // cursor right
  458.                     case 0x1E:  // cursor up
  459.                     case 0x1F:  // cursor down
  460.                     case ' ':
  461.                     case '.':
  462.                     case '-':
  463.                     case '0':
  464.                     case '1':
  465.                     case '2':
  466.                     case '3':
  467.                     case '4':
  468.                     case '5':
  469.                     case '6':
  470.                     case '7':
  471.                     case '8':
  472.                     case '9':
  473.                         // Pass it to the dialog
  474.                         passToDialog = true;
  475.                     break;
  476.                     
  477.                     case 0x03:  // enter
  478.                     case 0x0D:  // return
  479.                         if (inEvent->what != autoKey)
  480.                         {
  481.                             // Update button equivalent
  482.                             GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Update, &itemType, &itemHandle, &itemBounds);
  483.                             updateButton = (ControlHandle) itemHandle;
  484.                             
  485.                             if ((*updateButton)->contrlHilite == 0)
  486.                             {
  487.                                 HiliteControl(updateButton, 1);
  488.                                 
  489.                                 timeout = TickCount()+6;
  490.                                 while (TickCount() < timeout) /* wait */;
  491.                                 
  492.                                 HiliteControl(updateButton, 0);
  493.                                 
  494.                                 TestHiLevel_GetDialogFields();
  495.                                 
  496.                                 consumed = true;
  497.                             }
  498.                         }
  499.                     break;
  500.                     
  501.                     default:
  502.                         SysBeep(10);
  503.                         consumed = true;
  504.                 }
  505.             }
  506.         break;
  507.         
  508.         case activateEvt:
  509.             // We need to look at the activate event here because it is
  510.             // consumed by IsDialogEvent/DialogSelect below and so never
  511.             // gets to the window stuff
  512.             window = (WindowPtr) inEvent->message;
  513.             
  514.             if (inEvent->modifiers & activeFlag)
  515.             {
  516.                 Window_Activate(window);
  517.             }
  518.             else
  519.             {
  520.                 Window_Deactivate(window);
  521.             }
  522.         break;
  523.         
  524.         case nullEvent:
  525.             // Find where we are in the cycle (0 is start, 1 is end)
  526.             Microseconds(&now);
  527.             gTestHiLevelInterpolant = Utils_Interval(&gTestHiLevelCycleStart, &now) / gTestHiLevelData.duration;
  528.             
  529.             switch (Menu_GetInterpolation())
  530.             {
  531.                 case kInterpolationItem_Sinusoidal:
  532.                     gTestHiLevelInterpolant = 0.5*sinf(gTestHiLevelInterpolant*_PI*2.0) + 0.5;
  533.                 break;
  534.                 
  535.                 case kInterpolationItem_Triangular:
  536.                     gTestHiLevelInterpolant = 2.0*fmodf(gTestHiLevelInterpolant, 1.0);
  537.                     
  538.                     if (gTestHiLevelInterpolant > 1.0)
  539.                     {
  540.                         gTestHiLevelInterpolant = 2.0-gTestHiLevelInterpolant;
  541.                     }
  542.                 break;
  543.                 
  544.                 case kInterpolationItem_Sawtooth:
  545.                     gTestHiLevelInterpolant = fmodf(2.0*gTestHiLevelInterpolant, 1.0);
  546.                 break;
  547.             }
  548.             
  549.             TestHiLevel_Interpolate();
  550.         break;
  551.     }
  552.     
  553.     // Do dialog stuff
  554.     if (passToDialog)
  555.     {
  556.         consumed = IsDialogEvent(inEvent);
  557.         if (consumed)
  558.         {
  559.             if (DialogSelect(inEvent, &window, &item))
  560.             {
  561.                 switch (item)
  562.                 {
  563.                     case kHiLevelItem_Update:
  564.                         TestHiLevel_GetDialogFields();
  565.                     break;
  566.                 }
  567.             }
  568.         }
  569.     }
  570.     
  571.     // Return the result
  572.     *outConsumed = consumed;
  573. }
  574.  
  575.  
  576. /* =============================================================================
  577.  *        TestHiLevel_Update (internal)
  578.  *
  579.  *    Updates the contents of the window.
  580.  * ========================================================================== */
  581. void TestHiLevel_Update(
  582.     WindowPtr            inWindow)
  583. {
  584.     DrawDialog(inWindow);
  585. }
  586.  
  587.  
  588. /* =============================================================================
  589.  *        TestHiLevel_Activate (internal)
  590.  *
  591.  *    Handles window activation.
  592.  * ========================================================================== */
  593. void TestHiLevel_Activate(
  594.     WindowPtr            inWindow)
  595. {
  596.     InsertMenu(gTestHiLevelPresetMenu, 0);
  597.     DrawMenuBar();
  598. }
  599.  
  600.  
  601. /* =============================================================================
  602.  *        TestHiLevel_Deactivate (internal)
  603.  *
  604.  *    Handles window deactivation.
  605.  * ========================================================================== */
  606. void TestHiLevel_Deactivate(
  607.     WindowPtr            inWindow)
  608. {
  609.     DeleteMenu(kMenuID_HiLevelPreset);
  610.     DrawMenuBar();
  611. }
  612.  
  613.  
  614. /* =============================================================================
  615.  *        TestHiLevel_ProgressUserItem (internal)
  616.  *
  617.  *    Draws the user item used for progress bar, based on gTestHiLevelInterpolant.
  618.  * ========================================================================== */
  619. pascal void TestHiLevel_ProgressUserItem(
  620.     DialogPtr            inDialog,
  621.     short                inItem)
  622. {
  623.     short                itemType;
  624.     Handle                itemHandle;
  625.     Rect                itemBounds;
  626.     short                size;
  627.     Rect                leftWhite;
  628.     Rect                rightWhite;
  629.     Rect                indicator;
  630.     
  631.     GetDialogItem(inDialog, inItem, &itemType, &itemHandle, &itemBounds);
  632.     
  633.     FrameRect(&itemBounds);
  634.     
  635.     InsetRect(&itemBounds, 1, 1);
  636.     size = itemBounds.bottom-itemBounds.top;
  637.     
  638.     indicator = itemBounds;
  639.     indicator.left = itemBounds.left + (long) (gTestHiLevelInterpolant*(itemBounds.right-itemBounds.left-size) + 0.5);
  640.     indicator.right = indicator.left+size;
  641.     
  642.     leftWhite = itemBounds;
  643.     leftWhite.right = indicator.left;
  644.     
  645.     rightWhite = itemBounds;
  646.     rightWhite.left = indicator.right;
  647.     
  648.     FrameRect(&indicator);
  649.     
  650.     InsetRect(&indicator, 1, 1);
  651.     FillRect(&indicator, &qd.gray);
  652.     
  653.     EraseRect(&leftWhite);
  654.     EraseRect(&rightWhite);
  655. }
  656.  
  657.  
  658. /* =============================================================================
  659.  *        TestHiLevel_Interpolate (internal)
  660.  *
  661.  *    Changes the sound channel to the correct values for the point between
  662.  *    zero and one determined by gTestHiLevelInterpolant.
  663.  * ========================================================================== */
  664. void TestHiLevel_Interpolate(
  665.     void)
  666. {
  667.     OSStatus            err;
  668.     TQ3Vector3D            v0;
  669.     TQ3Vector3D            v1;
  670.     TQ3Vector3D            v2;
  671.     TQ3Point3D            origin = {0.0, 0.0, 0.0};
  672.     TQ3Matrix4x4        m0;
  673.     TQ3Matrix4x4        m1;
  674.     TQ3Matrix4x4        m2;
  675.     TQ3Matrix4x4        m;
  676.     SSpLocalizationData    snd3DInfo;
  677.     
  678.     if (gTestHiLevelUpdate                            ||
  679.         gTestHiLevelData.listenerTranslateRange        ||
  680.         gTestHiLevelData.listenerRotationAxisRange    ||
  681.         gTestHiLevelData.listenerRotationAngleRange    ||
  682.         gTestHiLevelData.listenerScaleRange)
  683.     {
  684.         TestHiLevel_InterpolateVector3D(
  685.                 gTestHiLevelInterpolant,
  686.                 &gTestHiLevelData.listenerTranslate1,
  687.                 &gTestHiLevelData.listenerTranslate2,
  688.                 gTestHiLevelData.listenerTranslateRange,
  689.                 &v0);
  690.         
  691.         TestHiLevel_InterpolateNormalVector3D(
  692.                 gTestHiLevelInterpolant,
  693.                 &gTestHiLevelData.listenerRotationAxis1,
  694.                 &gTestHiLevelData.listenerRotationAxis2,
  695.                 gTestHiLevelData.listenerRotationAxisRange,
  696.                 &v1);
  697.         
  698.         TestHiLevel_InterpolateVector3D(
  699.                 gTestHiLevelInterpolant,
  700.                 &gTestHiLevelData.listenerScale1,
  701.                 &gTestHiLevelData.listenerScale2,
  702.                 gTestHiLevelData.listenerScaleRange,
  703.                 &v2);
  704.         
  705.         Q3Matrix4x4_SetTranslate(
  706.                 &m0,
  707.                 v0.x,
  708.                 v0.y,
  709.                 v0.z);
  710.         
  711.         Q3Matrix4x4_SetRotateAboutAxis(
  712.                 &m1,
  713.                 &origin,
  714.                 &v1,
  715.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  716.                         gTestHiLevelInterpolant,
  717.                         gTestHiLevelData.listenerRotationAngle1,
  718.                         gTestHiLevelData.listenerRotationAngle2,
  719.                         gTestHiLevelData.listenerRotationAngleRange)));
  720.         
  721.         Q3Matrix4x4_SetScale(
  722.                 &m2,
  723.                 v2.x,
  724.                 v2.y,
  725.                 v2.z);
  726.         
  727.         Q3Matrix4x4_Multiply(
  728.                 &m0,
  729.                 &m1,
  730.                 &m);
  731.         
  732.         Q3Matrix4x4_Multiply(
  733.                 &m,
  734.                 &m2,
  735.                 &m);
  736.         
  737.         err = SSpListener_SetTransform(gTestHiLevelListener, &m);
  738.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetTransform");
  739.     }
  740.     
  741.     if (gTestHiLevelUpdate                            ||
  742.         gTestHiLevelData.listenerPositionRange)
  743.     {
  744.         TestHiLevel_InterpolateVector3D(
  745.                 gTestHiLevelInterpolant,
  746.                 &gTestHiLevelData.listenerPosition1,
  747.                 &gTestHiLevelData.listenerPosition2,
  748.                 gTestHiLevelData.listenerPositionRange,
  749.                 &v0);
  750.         
  751.         err = SSpListener_SetPosition(gTestHiLevelListener, (const TQ3Point3D*) &v0);
  752.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetPosition");
  753.     }
  754.     
  755.     if (gTestHiLevelUpdate                            ||
  756.         gTestHiLevelData.listenerOrientationRange)
  757.     {
  758.         TestHiLevel_InterpolateNormalVector3D(
  759.                 gTestHiLevelInterpolant,
  760.                 &gTestHiLevelData.listenerOrientation1,
  761.                 &gTestHiLevelData.listenerOrientation2,
  762.                 gTestHiLevelData.listenerOrientationRange,
  763.                 &v0);
  764.         
  765.         err = SSpListener_SetOrientation(gTestHiLevelListener, &v0);
  766.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetOrientation");
  767.     }
  768.     
  769.     if (gTestHiLevelUpdate                            ||
  770.         gTestHiLevelData.listenerUpVectorRange)
  771.     {
  772.         TestHiLevel_InterpolateNormalVector3D(
  773.                 gTestHiLevelInterpolant,
  774.                 &gTestHiLevelData.listenerUpVector1,
  775.                 &gTestHiLevelData.listenerUpVector2,
  776.                 gTestHiLevelData.listenerUpVectorRange,
  777.                 &v0);
  778.         
  779.         err = SSpListener_SetUpVector(gTestHiLevelListener, &v0);
  780.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetUpVector");
  781.     }
  782.     
  783.     if (gTestHiLevelUpdate                            ||
  784.         gTestHiLevelData.listenerVelocityRange)
  785.     {
  786.         TestHiLevel_InterpolateVector3D(
  787.                 gTestHiLevelInterpolant,
  788.                 &gTestHiLevelData.listenerVelocity1,
  789.                 &gTestHiLevelData.listenerVelocity2,
  790.                 gTestHiLevelData.listenerVelocityRange,
  791.                 &v0);
  792.         
  793.         err = SSpListener_SetVelocity(gTestHiLevelListener, &v0);
  794.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetVelocity");
  795.     }
  796.     
  797.     if (gTestHiLevelUpdate                            ||
  798.         gTestHiLevelData.humidityRange)
  799.     {
  800.         err = SSpListener_SetMedium(
  801.                 gTestHiLevelListener,
  802.                 gTestHiLevelData.medium,
  803.                 TestHiLevel_InterpolateFloat(
  804.                         gTestHiLevelInterpolant,
  805.                         gTestHiLevelData.humidity1,
  806.                         gTestHiLevelData.humidity2,
  807.                         gTestHiLevelData.humidityRange));
  808.         
  809.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetMedium");
  810.     }
  811.     
  812.     if (gTestHiLevelUpdate                            ||
  813.         gTestHiLevelData.roomSizeRange                ||
  814.         gTestHiLevelData.roomReflectivityRange        ||
  815.         gTestHiLevelData.reverbAttenuationRange)
  816.     {
  817.         err = SSpListener_SetReverb(
  818.                 gTestHiLevelListener,
  819.                 TestHiLevel_InterpolateFloat(
  820.                         gTestHiLevelInterpolant,
  821.                         gTestHiLevelData.roomSize1,
  822.                         gTestHiLevelData.roomSize2,
  823.                         gTestHiLevelData.roomSizeRange),
  824.                 TestHiLevel_InterpolateFloat(
  825.                         gTestHiLevelInterpolant,
  826.                         gTestHiLevelData.roomReflectivity1,
  827.                         gTestHiLevelData.roomReflectivity2,
  828.                         gTestHiLevelData.roomReflectivityRange),
  829.                 TestHiLevel_InterpolateFloat(
  830.                         gTestHiLevelInterpolant,
  831.                         gTestHiLevelData.reverbAttenuation1,
  832.                         gTestHiLevelData.reverbAttenuation2,
  833.                         gTestHiLevelData.reverbAttenuationRange));
  834.         
  835.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_SetReverb");
  836.     }
  837.     
  838.     if (gTestHiLevelUpdate                            ||
  839.         gTestHiLevelData.cpuLoadRange)
  840.     {
  841.         err = SSpSource_SetCPULoad(
  842.                 gTestHiLevelSource,
  843.                 (UInt32) (TestHiLevel_InterpolateFloat(
  844.                         gTestHiLevelInterpolant,
  845.                         (float) gTestHiLevelData.cpuLoad1,
  846.                         (float) gTestHiLevelData.cpuLoad2,
  847.                         gTestHiLevelData.cpuLoadRange) + 0.5));
  848.         
  849.         Message_CheckError(err, "TestHiLevel_Interpolate", "SetSourceCPULoad");
  850.     }
  851.     
  852.     if (gTestHiLevelUpdate                            ||
  853.         gTestHiLevelData.sourceTranslateRange        ||
  854.         gTestHiLevelData.sourceRotationAxisRange    ||
  855.         gTestHiLevelData.sourceRotationAngleRange    ||
  856.         gTestHiLevelData.sourceScaleRange)
  857.     {
  858.         TestHiLevel_InterpolateVector3D(
  859.                 gTestHiLevelInterpolant,
  860.                 &gTestHiLevelData.sourceTranslate1,
  861.                 &gTestHiLevelData.sourceTranslate2,
  862.                 gTestHiLevelData.sourceTranslateRange,
  863.                 &v0);
  864.         
  865.         TestHiLevel_InterpolateNormalVector3D(
  866.                 gTestHiLevelInterpolant,
  867.                 &gTestHiLevelData.sourceRotationAxis1,
  868.                 &gTestHiLevelData.sourceRotationAxis2,
  869.                 gTestHiLevelData.sourceRotationAxisRange,
  870.                 &v1);
  871.         
  872.         TestHiLevel_InterpolateVector3D(
  873.                 gTestHiLevelInterpolant,
  874.                 &gTestHiLevelData.sourceScale1,
  875.                 &gTestHiLevelData.sourceScale2,
  876.                 gTestHiLevelData.sourceScaleRange,
  877.                 &v2);
  878.         
  879.         Q3Matrix4x4_SetTranslate(
  880.                 &m0,
  881.                 v0.x,
  882.                 v0.y,
  883.                 v0.z);
  884.         
  885.         Q3Matrix4x4_SetRotateAboutAxis(
  886.                 &m1,
  887.                 &origin,
  888.                 &v1,
  889.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  890.                         gTestHiLevelInterpolant,
  891.                         gTestHiLevelData.sourceRotationAngle1,
  892.                         gTestHiLevelData.sourceRotationAngle2,
  893.                         gTestHiLevelData.sourceRotationAngleRange)));
  894.         
  895.         Q3Matrix4x4_SetScale(
  896.                 &m2,
  897.                 v2.x,
  898.                 v2.y,
  899.                 v2.z);
  900.         
  901.         Q3Matrix4x4_Multiply(
  902.                 &m0,
  903.                 &m1,
  904.                 &m);
  905.         
  906.         Q3Matrix4x4_Multiply(
  907.                 &m,
  908.                 &m2,
  909.                 &m);
  910.         
  911.         err = SSpSource_SetTransform(gTestHiLevelSource, &m);
  912.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetTransform");
  913.     }
  914.     
  915.     if (gTestHiLevelUpdate                            ||
  916.         gTestHiLevelData.sourcePositionRange)
  917.     {
  918.         TestHiLevel_InterpolateVector3D(
  919.                 gTestHiLevelInterpolant,
  920.                 &gTestHiLevelData.sourcePosition1,
  921.                 &gTestHiLevelData.sourcePosition2,
  922.                 gTestHiLevelData.sourcePositionRange,
  923.                 &v0);
  924.         
  925.         err = SSpSource_SetPosition(gTestHiLevelSource, (const TQ3Point3D*) &v0);
  926.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetPosition");
  927.     }
  928.     
  929.     if (gTestHiLevelUpdate                            ||
  930.         gTestHiLevelData.sourceOrientationRange)
  931.     {
  932.         TestHiLevel_InterpolateNormalVector3D(
  933.                 gTestHiLevelInterpolant,
  934.                 &gTestHiLevelData.sourceOrientation1,
  935.                 &gTestHiLevelData.sourceOrientation2,
  936.                 gTestHiLevelData.sourceOrientationRange,
  937.                 &v0);
  938.         
  939.         err = SSpSource_SetOrientation(gTestHiLevelSource, &v0);
  940.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetOrientation");
  941.     }
  942.     
  943.     if (gTestHiLevelUpdate                            ||
  944.         gTestHiLevelData.sourceUpVectorRange)
  945.     {
  946.         TestHiLevel_InterpolateNormalVector3D(
  947.                 gTestHiLevelInterpolant,
  948.                 &gTestHiLevelData.sourceUpVector1,
  949.                 &gTestHiLevelData.sourceUpVector2,
  950.                 gTestHiLevelData.sourceUpVectorRange,
  951.                 &v0);
  952.         
  953.         err = SSpSource_SetUpVector(gTestHiLevelSource, &v0);
  954.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetUpVector");
  955.     }
  956.     
  957.     if (gTestHiLevelUpdate                            ||
  958.         gTestHiLevelData.sourceVelocityRange)
  959.     {
  960.         TestHiLevel_InterpolateVector3D(
  961.                 gTestHiLevelInterpolant,
  962.                 &gTestHiLevelData.sourceVelocity1,
  963.                 &gTestHiLevelData.sourceVelocity2,
  964.                 gTestHiLevelData.sourceVelocityRange,
  965.                 &v0);
  966.         
  967.         err = SSpSource_SetVelocity(gTestHiLevelSource, &v0);
  968.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetVelocity");
  969.     }
  970.     
  971.     if (gTestHiLevelUpdate)
  972.     {
  973.         err = SSpSource_SetMode(
  974.                 gTestHiLevelSource,
  975.                 gTestHiLevelData.sourceMode);
  976.         
  977.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetMode");
  978.     }
  979.     
  980.     if (gTestHiLevelUpdate                            ||
  981.         gTestHiLevelData.referenceDistanceRange)
  982.     {
  983.         err = SSpSource_SetReferenceDistance(
  984.                 gTestHiLevelSource,
  985.                 TestHiLevel_InterpolateFloat(
  986.                         gTestHiLevelInterpolant,
  987.                         gTestHiLevelData.referenceDistance1,
  988.                         gTestHiLevelData.referenceDistance2,
  989.                         gTestHiLevelData.referenceDistanceRange));
  990.         
  991.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetReferenceDistance");
  992.     }
  993.     
  994.     if (gTestHiLevelUpdate                            ||
  995.         gTestHiLevelData.lengthRange                ||
  996.         gTestHiLevelData.widthRange                    ||
  997.         gTestHiLevelData.heightRange)
  998.     {
  999.         err = SSpSource_SetSize(
  1000.                 gTestHiLevelSource,
  1001.                 TestHiLevel_InterpolateFloat(
  1002.                         gTestHiLevelInterpolant,
  1003.                         gTestHiLevelData.length1,
  1004.                         gTestHiLevelData.length2,
  1005.                         gTestHiLevelData.lengthRange),
  1006.                 TestHiLevel_InterpolateFloat(
  1007.                         gTestHiLevelInterpolant,
  1008.                         gTestHiLevelData.width1,
  1009.                         gTestHiLevelData.width2,
  1010.                         gTestHiLevelData.widthRange),
  1011.                 TestHiLevel_InterpolateFloat(
  1012.                         gTestHiLevelInterpolant,
  1013.                         gTestHiLevelData.height1,
  1014.                         gTestHiLevelData.height2,
  1015.                         gTestHiLevelData.heightRange));
  1016.         
  1017.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetSize");
  1018.     }
  1019.     
  1020.     if (gTestHiLevelUpdate                            ||
  1021.         gTestHiLevelData.coneAngleDegRange            ||
  1022.         gTestHiLevelData.coneAttenuationRange)
  1023.     {
  1024.         err = SSpSource_SetAngularAttenuation(
  1025.                 gTestHiLevelSource,
  1026.                 Q3Math_DegreesToRadians(TestHiLevel_InterpolateFloat(
  1027.                         gTestHiLevelInterpolant,
  1028.                         gTestHiLevelData.coneAngleDeg1,
  1029.                         gTestHiLevelData.coneAngleDeg2,
  1030.                         gTestHiLevelData.coneAngleDegRange)),
  1031.                 TestHiLevel_InterpolateFloat(
  1032.                         gTestHiLevelInterpolant,
  1033.                         gTestHiLevelData.coneAttenuation1,
  1034.                         gTestHiLevelData.coneAttenuation2,
  1035.                         gTestHiLevelData.coneAttenuationRange));
  1036.         
  1037.         Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_SetAngularAttenuation");
  1038.     }
  1039.     
  1040.     // Make the filter changes
  1041.     err = SSpSource_CalcLocalization(gTestHiLevelSource, gTestHiLevelListener, &snd3DInfo);
  1042.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_CalcLocalization");
  1043.     
  1044.     Sound_Set3DInfo(&snd3DInfo);
  1045.     
  1046.     // Update the progress bar
  1047.     SetPort(gTestHiLevelDialog);
  1048.     TestHiLevel_ProgressUserItem(gTestHiLevelDialog, kHiLevelItem_Progress);
  1049.     
  1050.     // Show the actual velocities
  1051.     err = SSpListener_GetActualVelocity(gTestHiLevelListener, &v0);
  1052.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpListener_GetActualVelocity");
  1053.     
  1054.     if (gTestHiLevelListenerActual.x != v0.x ||
  1055.         gTestHiLevelListenerActual.y != v0.y ||
  1056.         gTestHiLevelListenerActual.z != v0.z)
  1057.     {
  1058.         gTestHiLevelListenerActual = v0;
  1059.         
  1060.         Utils_SetVector3DField(
  1061.                 gTestHiLevelDialog,
  1062.                 kHiLevelItem_ListenerActualVelocity,
  1063.                 &gTestHiLevelListenerActual,
  1064.                 true);
  1065.     }
  1066.     
  1067.     err = SSpSource_GetActualVelocity(gTestHiLevelSource, &v0);
  1068.     Message_CheckError(err, "TestHiLevel_Interpolate", "SSpSource_GetActualVelocity");
  1069.     
  1070.     if (gTestHiLevelSourceActual.x != v0.x ||
  1071.         gTestHiLevelSourceActual.y != v0.y ||
  1072.         gTestHiLevelSourceActual.z != v0.z)
  1073.     {
  1074.         gTestHiLevelSourceActual = v0;
  1075.         
  1076.         Utils_SetVector3DField(
  1077.                 gTestHiLevelDialog,
  1078.                 kHiLevelItem_SourceActualVelocity,
  1079.                 &gTestHiLevelSourceActual,
  1080.                 true);
  1081.     }
  1082.     
  1083.     // Done
  1084.     gTestHiLevelUpdate = false;
  1085. }
  1086.  
  1087.  
  1088. /* =============================================================================
  1089.  *        TestHiLevel_InterpolateFloat (internal)
  1090.  *
  1091.  *    Linear interpolation.  When inWhere is zero, inVal0 is returned.  When it
  1092.  *    is one, inVal1 is returned.  In between is linear.  If inIsRange is false
  1093.  *    then we ignore inVal1 and always return inVal0.
  1094.  * ========================================================================== */
  1095. float TestHiLevel_InterpolateFloat(
  1096.     float                inWhere,
  1097.     float                inVal0,
  1098.     float                inVal1,
  1099.     Boolean                inIsRange)
  1100. {
  1101.     float                result;
  1102.     
  1103.     if (inIsRange)
  1104.     {
  1105.         result = inWhere*(inVal1-inVal0) + inVal0;
  1106.     }
  1107.     else
  1108.     {
  1109.         result = inVal0;
  1110.     }
  1111.     
  1112.     return result;
  1113. }
  1114.  
  1115.  
  1116. /* =============================================================================
  1117.  *        TestHiLevel_InterpolateVector3D (internal)
  1118.  *
  1119.  *    Linear interpolation on vectors.
  1120.  * ========================================================================== */
  1121. static void TestHiLevel_InterpolateVector3D(
  1122.     float                inWhere,
  1123.     const TQ3Vector3D*    inVal0,
  1124.     const TQ3Vector3D*    inVal1,
  1125.     Boolean                inIsRange,
  1126.     TQ3Vector3D*        outResult)
  1127. {
  1128.     if (inIsRange)
  1129.     {
  1130.         outResult->x = TestHiLevel_InterpolateFloat(inWhere, inVal0->x, inVal1->x, true);
  1131.         outResult->y = TestHiLevel_InterpolateFloat(inWhere, inVal0->y, inVal1->y, true);
  1132.         outResult->z = TestHiLevel_InterpolateFloat(inWhere, inVal0->z, inVal1->z, true);
  1133.     }
  1134.     else
  1135.     {
  1136.         *outResult = *inVal0;
  1137.     }
  1138. }
  1139.  
  1140.  
  1141. /* =============================================================================
  1142.  *        TestHiLevel_InterpolateNormalVector3D (internal)
  1143.  *
  1144.  *    Interpolation on unit-length vectors.
  1145.  *
  1146.  *    NOTE:    We could do a better job of this, e. g. spherical interpolation,
  1147.  *            but why bother?
  1148.  * ========================================================================== */
  1149. static void TestHiLevel_InterpolateNormalVector3D(
  1150.     float                inWhere,
  1151.     const TQ3Vector3D*    inVal0,
  1152.     const TQ3Vector3D*    inVal1,
  1153.     Boolean                inIsRange,
  1154.     TQ3Vector3D*        outResult)
  1155. {
  1156.     float                scale;
  1157.     
  1158.     TestHiLevel_InterpolateVector3D(inWhere, inVal0, inVal1, inIsRange, outResult);
  1159.     
  1160.     scale = outResult->x*outResult->x +
  1161.             outResult->y*outResult->y +
  1162.             outResult->z*outResult->z;
  1163.     
  1164.     if (scale > 0.001)
  1165.     {
  1166.         scale = 1.0/sqrtf(scale);
  1167.         
  1168.         outResult->x *= scale;
  1169.         outResult->y *= scale;
  1170.         outResult->z *= scale;
  1171.     }
  1172. }
  1173.  
  1174.  
  1175. /* =============================================================================
  1176.  *        TestHiLevel_DeriveData (internal)
  1177.  *
  1178.  *    Compute the derived fields in gTestHiLevelData.
  1179.  * ========================================================================== */
  1180. void TestHiLevel_DeriveData(
  1181.     void)
  1182. {
  1183.     gTestHiLevelData.coneAngleCos1 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg1);
  1184.     gTestHiLevelData.coneAngleCos2 = cosf(0.5*(_PI/180.0)*gTestHiLevelData.coneAngleDeg2);
  1185.     
  1186.     //• FOR THE NON-RANGE VALUES, SET THEM IN THE SOURCE AND LISTENER
  1187. }
  1188.  
  1189.  
  1190. /* =============================================================================
  1191.  *        TestHiLevel_SetDialogFields (internal)
  1192.  *
  1193.  *    Changes the dialog's fields to reflect gTestHiLevelData.
  1194.  * ========================================================================== */
  1195. void TestHiLevel_SetDialogFields(
  1196.     void)
  1197. {
  1198.     short                itemType;
  1199.     Handle                itemHandle;
  1200.     Rect                itemBounds;
  1201.     short                value;
  1202.     
  1203.     Utils_SetFloatField(
  1204.             gTestHiLevelDialog,
  1205.             kHiLevelItem_Duration,
  1206.             gTestHiLevelData.duration,
  1207.             true);
  1208.     
  1209.     Utils_SetVector3DField(
  1210.             gTestHiLevelDialog,
  1211.             kHiLevelItem_ListenerTranslate1,
  1212.             &gTestHiLevelData.listenerTranslate1,
  1213.             true);
  1214.     
  1215.     Utils_SetVector3DField(
  1216.             gTestHiLevelDialog,
  1217.             kHiLevelItem_ListenerTranslate2,
  1218.             &gTestHiLevelData.listenerTranslate2,
  1219.             gTestHiLevelData.listenerTranslateRange);
  1220.     
  1221.     Utils_SetVector3DField(
  1222.             gTestHiLevelDialog,
  1223.             kHiLevelItem_ListenerRotationAxis1,
  1224.             &gTestHiLevelData.listenerRotationAxis1,
  1225.             true);
  1226.     
  1227.     Utils_SetVector3DField(
  1228.             gTestHiLevelDialog,
  1229.             kHiLevelItem_ListenerRotationAxis2,
  1230.             &gTestHiLevelData.listenerRotationAxis2,
  1231.             gTestHiLevelData.listenerRotationAxisRange);
  1232.     
  1233.     Utils_SetFloatField(
  1234.             gTestHiLevelDialog,
  1235.             kHiLevelItem_ListenerRotationAngle1,
  1236.             gTestHiLevelData.listenerRotationAngle1,
  1237.             true);
  1238.     
  1239.     Utils_SetFloatField(
  1240.             gTestHiLevelDialog,
  1241.             kHiLevelItem_ListenerRotationAngle2,
  1242.             gTestHiLevelData.listenerRotationAngle2,
  1243.             gTestHiLevelData.listenerRotationAngleRange);
  1244.     
  1245.     Utils_SetVector3DField(
  1246.             gTestHiLevelDialog,
  1247.             kHiLevelItem_ListenerScale1,
  1248.             &gTestHiLevelData.listenerScale1,
  1249.             true);
  1250.     
  1251.     Utils_SetVector3DField(
  1252.             gTestHiLevelDialog,
  1253.             kHiLevelItem_ListenerScale2,
  1254.             &gTestHiLevelData.listenerScale2,
  1255.             gTestHiLevelData.listenerScaleRange);
  1256.     
  1257.     Utils_SetVector3DField(
  1258.             gTestHiLevelDialog,
  1259.             kHiLevelItem_ListenerPosition1,
  1260.             &gTestHiLevelData.listenerPosition1,
  1261.             true);
  1262.     
  1263.     Utils_SetVector3DField(
  1264.             gTestHiLevelDialog,
  1265.             kHiLevelItem_ListenerPosition2,
  1266.             &gTestHiLevelData.listenerPosition2,
  1267.             gTestHiLevelData.listenerPositionRange);
  1268.     
  1269.     Utils_SetVector3DField(
  1270.             gTestHiLevelDialog,
  1271.             kHiLevelItem_ListenerOrientation1,
  1272.             &gTestHiLevelData.listenerOrientation1,
  1273.             true);
  1274.     
  1275.     Utils_SetVector3DField(
  1276.             gTestHiLevelDialog,
  1277.             kHiLevelItem_ListenerOrientation2,
  1278.             &gTestHiLevelData.listenerOrientation2,
  1279.             gTestHiLevelData.listenerOrientationRange);
  1280.     
  1281.     Utils_SetVector3DField(
  1282.             gTestHiLevelDialog,
  1283.             kHiLevelItem_ListenerUpVector1,
  1284.             &gTestHiLevelData.listenerUpVector1,
  1285.             true);
  1286.     
  1287.     Utils_SetVector3DField(
  1288.             gTestHiLevelDialog,
  1289.             kHiLevelItem_ListenerUpVector2,
  1290.             &gTestHiLevelData.listenerUpVector2,
  1291.             gTestHiLevelData.listenerUpVectorRange);
  1292.     
  1293.     Utils_SetVector3DField(
  1294.             gTestHiLevelDialog,
  1295.             kHiLevelItem_ListenerVelocity1,
  1296.             &gTestHiLevelData.listenerVelocity1,
  1297.             true);
  1298.     
  1299.     Utils_SetVector3DField(
  1300.             gTestHiLevelDialog,
  1301.             kHiLevelItem_ListenerVelocity2,
  1302.             &gTestHiLevelData.listenerVelocity2,
  1303.             gTestHiLevelData.listenerVelocityRange);
  1304.     
  1305.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1306.     SetControlValue((ControlHandle) itemHandle,
  1307.             (gTestHiLevelData.medium == kSSpMedium_Water)
  1308.                     ? kMediumItem_Water
  1309.                     : kMediumItem_Air);
  1310.     
  1311.     Utils_SetFloatField(
  1312.             gTestHiLevelDialog,
  1313.             kHiLevelItem_Humidity1,
  1314.             gTestHiLevelData.humidity1,
  1315.             true);
  1316.     
  1317.     Utils_SetFloatField(
  1318.             gTestHiLevelDialog,
  1319.             kHiLevelItem_Humidity2,
  1320.             gTestHiLevelData.humidity2,
  1321.             gTestHiLevelData.humidityRange);
  1322.     
  1323.     Utils_SetFloatField(
  1324.             gTestHiLevelDialog,
  1325.             kHiLevelItem_RoomSize1,
  1326.             gTestHiLevelData.roomSize1,
  1327.             true);
  1328.     
  1329.     Utils_SetFloatField(
  1330.             gTestHiLevelDialog,
  1331.             kHiLevelItem_RoomSize2,
  1332.             gTestHiLevelData.roomSize2,
  1333.             gTestHiLevelData.roomSizeRange);
  1334.     
  1335.     Utils_SetFloatField(
  1336.             gTestHiLevelDialog,
  1337.             kHiLevelItem_RoomReflectivity1,
  1338.             gTestHiLevelData.roomReflectivity1,
  1339.             true);
  1340.     
  1341.     Utils_SetFloatField(
  1342.             gTestHiLevelDialog,
  1343.             kHiLevelItem_RoomReflectivity2,
  1344.             gTestHiLevelData.roomReflectivity2,
  1345.             gTestHiLevelData.roomReflectivityRange);
  1346.     
  1347.     Utils_SetFloatField(
  1348.             gTestHiLevelDialog,
  1349.             kHiLevelItem_ReverbAttenuation1,
  1350.             gTestHiLevelData.reverbAttenuation1,
  1351.             true);
  1352.     
  1353.     Utils_SetFloatField(
  1354.             gTestHiLevelDialog,
  1355.             kHiLevelItem_ReverbAttenuation2,
  1356.             gTestHiLevelData.reverbAttenuation2,
  1357.             gTestHiLevelData.reverbAttenuationRange);
  1358.     
  1359.     Utils_SetUInt32Field(
  1360.             gTestHiLevelDialog,
  1361.             kHiLevelItem_CPULoad1,
  1362.             gTestHiLevelData.cpuLoad1,
  1363.             true);
  1364.     
  1365.     Utils_SetUInt32Field(
  1366.             gTestHiLevelDialog,
  1367.             kHiLevelItem_CPULoad2,
  1368.             gTestHiLevelData.cpuLoad2,
  1369.             gTestHiLevelData.cpuLoadRange);
  1370.     
  1371.     Utils_SetVector3DField(
  1372.             gTestHiLevelDialog,
  1373.             kHiLevelItem_SourceTranslate1,
  1374.             &gTestHiLevelData.sourceTranslate1,
  1375.             true);
  1376.     
  1377.     Utils_SetVector3DField(
  1378.             gTestHiLevelDialog,
  1379.             kHiLevelItem_SourceTranslate2,
  1380.             &gTestHiLevelData.sourceTranslate2,
  1381.             gTestHiLevelData.sourceTranslateRange);
  1382.     
  1383.     Utils_SetVector3DField(
  1384.             gTestHiLevelDialog,
  1385.             kHiLevelItem_SourceRotationAxis1,
  1386.             &gTestHiLevelData.sourceRotationAxis1,
  1387.             true);
  1388.     
  1389.     Utils_SetVector3DField(
  1390.             gTestHiLevelDialog,
  1391.             kHiLevelItem_SourceRotationAxis2,
  1392.             &gTestHiLevelData.sourceRotationAxis2,
  1393.             gTestHiLevelData.sourceRotationAxisRange);
  1394.     
  1395.     Utils_SetFloatField(
  1396.             gTestHiLevelDialog,
  1397.             kHiLevelItem_SourceRotationAngle1,
  1398.             gTestHiLevelData.sourceRotationAngle1,
  1399.             true);
  1400.     
  1401.     Utils_SetFloatField(
  1402.             gTestHiLevelDialog,
  1403.             kHiLevelItem_SourceRotationAngle2,
  1404.             gTestHiLevelData.sourceRotationAngle2,
  1405.             gTestHiLevelData.sourceRotationAngleRange);
  1406.     
  1407.     Utils_SetVector3DField(
  1408.             gTestHiLevelDialog,
  1409.             kHiLevelItem_SourceScale1,
  1410.             &gTestHiLevelData.sourceScale1,
  1411.             true);
  1412.     
  1413.     Utils_SetVector3DField(
  1414.             gTestHiLevelDialog,
  1415.             kHiLevelItem_SourceScale2,
  1416.             &gTestHiLevelData.sourceScale2,
  1417.             gTestHiLevelData.sourceScaleRange);
  1418.     
  1419.     Utils_SetVector3DField(
  1420.             gTestHiLevelDialog,
  1421.             kHiLevelItem_SourcePosition1,
  1422.             &gTestHiLevelData.sourcePosition1,
  1423.             true);
  1424.     
  1425.     Utils_SetVector3DField(
  1426.             gTestHiLevelDialog,
  1427.             kHiLevelItem_SourcePosition2,
  1428.             &gTestHiLevelData.sourcePosition2,
  1429.             gTestHiLevelData.sourcePositionRange);
  1430.     
  1431.     Utils_SetVector3DField(
  1432.             gTestHiLevelDialog,
  1433.             kHiLevelItem_SourceOrientation1,
  1434.             &gTestHiLevelData.sourceOrientation1,
  1435.             true);
  1436.     
  1437.     Utils_SetVector3DField(
  1438.             gTestHiLevelDialog,
  1439.             kHiLevelItem_SourceOrientation2,
  1440.             &gTestHiLevelData.sourceOrientation2,
  1441.             gTestHiLevelData.sourceOrientationRange);
  1442.     
  1443.     Utils_SetVector3DField(
  1444.             gTestHiLevelDialog,
  1445.             kHiLevelItem_SourceUpVector1,
  1446.             &gTestHiLevelData.sourceUpVector1,
  1447.             true);
  1448.     
  1449.     Utils_SetVector3DField(
  1450.             gTestHiLevelDialog,
  1451.             kHiLevelItem_SourceUpVector2,
  1452.             &gTestHiLevelData.sourceUpVector2,
  1453.             gTestHiLevelData.sourceUpVectorRange);
  1454.     
  1455.     Utils_SetVector3DField(
  1456.             gTestHiLevelDialog,
  1457.             kHiLevelItem_SourceVelocity1,
  1458.             &gTestHiLevelData.sourceVelocity1,
  1459.             true);
  1460.     
  1461.     Utils_SetVector3DField(
  1462.             gTestHiLevelDialog,
  1463.             kHiLevelItem_SourceVelocity2,
  1464.             &gTestHiLevelData.sourceVelocity2,
  1465.             gTestHiLevelData.sourceVelocityRange);
  1466.     
  1467.     value = kSourceModeItem_Unfiltered;
  1468.     switch (gTestHiLevelData.sourceMode)
  1469.     {
  1470.         case kSSpSourceMode_Localized:
  1471.             value = kSourceModeItem_Localized;
  1472.         break;
  1473.         
  1474.         case kSSpSourceMode_Ambient:
  1475.             value = kSourceModeItem_Ambient;
  1476.         break;
  1477.         
  1478.         case kSSpSourceMode_Binaural:
  1479.             value = kSourceModeItem_Binaural;
  1480.         break;
  1481.     }
  1482.     
  1483.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  1484.     SetControlValue((ControlHandle) itemHandle, value);
  1485.     
  1486.     Utils_SetFloatField(
  1487.             gTestHiLevelDialog,
  1488.             kHiLevelItem_ReferenceDistance1,
  1489.             gTestHiLevelData.referenceDistance1,
  1490.             true);
  1491.     
  1492.     Utils_SetFloatField(
  1493.             gTestHiLevelDialog,
  1494.             kHiLevelItem_ReferenceDistance2,
  1495.             gTestHiLevelData.referenceDistance2,
  1496.             gTestHiLevelData.referenceDistanceRange);
  1497.     
  1498.     Utils_SetFloatField(
  1499.             gTestHiLevelDialog,
  1500.             kHiLevelItem_Length1,
  1501.             gTestHiLevelData.length1,
  1502.             true);
  1503.     
  1504.     Utils_SetFloatField(
  1505.             gTestHiLevelDialog,
  1506.             kHiLevelItem_Length2,
  1507.             gTestHiLevelData.length2,
  1508.             gTestHiLevelData.lengthRange);
  1509.     
  1510.     Utils_SetFloatField(
  1511.             gTestHiLevelDialog,
  1512.             kHiLevelItem_Width1,
  1513.             gTestHiLevelData.width1,
  1514.             true);
  1515.     
  1516.     Utils_SetFloatField(
  1517.             gTestHiLevelDialog,
  1518.             kHiLevelItem_Width2,
  1519.             gTestHiLevelData.width2,
  1520.             gTestHiLevelData.widthRange);
  1521.     
  1522.     Utils_SetFloatField(
  1523.             gTestHiLevelDialog,
  1524.             kHiLevelItem_Height1,
  1525.             gTestHiLevelData.height1,
  1526.             true);
  1527.     
  1528.     Utils_SetFloatField(
  1529.             gTestHiLevelDialog,
  1530.             kHiLevelItem_Height2,
  1531.             gTestHiLevelData.height2,
  1532.             gTestHiLevelData.heightRange);
  1533.     
  1534.     Utils_SetFloatField(
  1535.             gTestHiLevelDialog,
  1536.             kHiLevelItem_ConeAngleDeg1,
  1537.             gTestHiLevelData.coneAngleDeg1,
  1538.             true);
  1539.     
  1540.     Utils_SetFloatField(
  1541.             gTestHiLevelDialog,
  1542.             kHiLevelItem_ConeAngleDeg2,
  1543.             gTestHiLevelData.coneAngleDeg2,
  1544.             gTestHiLevelData.coneAngleDegRange);
  1545.     
  1546.     Utils_SetFloatField(
  1547.             gTestHiLevelDialog,
  1548.             kHiLevelItem_ConeAttenuation1,
  1549.             gTestHiLevelData.coneAttenuation1,
  1550.             true);
  1551.     
  1552.     Utils_SetFloatField(
  1553.             gTestHiLevelDialog,
  1554.             kHiLevelItem_ConeAttenuation2,
  1555.             gTestHiLevelData.coneAttenuation2,
  1556.             gTestHiLevelData.coneAttenuationRange);
  1557. }
  1558.  
  1559.  
  1560. /* =============================================================================
  1561.  *        TestHiLevel_GetDialogFields (internal)
  1562.  *
  1563.  *    Grabs the contents of the dialog fields and puts them into gTestHiLevelData.
  1564.  * ========================================================================== */
  1565. void TestHiLevel_GetDialogFields(
  1566.     void)
  1567. {
  1568.     const float            small = 0.000001;
  1569.     const float            big = 10000000.0;
  1570.     short                itemType;
  1571.     Handle                itemHandle;
  1572.     Rect                itemBounds;
  1573.     TTestHiLevelData    data;
  1574.     short                badItem;
  1575.     
  1576.     if (!Utils_GetFloatField(
  1577.             gTestHiLevelDialog,
  1578.             kHiLevelItem_Duration,
  1579.             &data.duration,
  1580.             NULL,
  1581.             small,
  1582.             big))
  1583.     {
  1584.         badItem = kHiLevelItem_Duration;
  1585.         goto bail;
  1586.     }
  1587.     
  1588.     if (!Utils_GetVector3DField(
  1589.             gTestHiLevelDialog,
  1590.             kHiLevelItem_ListenerTranslate1,
  1591.             &data.listenerTranslate1,
  1592.             NULL))
  1593.     {
  1594.         badItem = kHiLevelItem_ListenerTranslate1;
  1595.         goto bail;
  1596.     }
  1597.     
  1598.     if (!Utils_GetVector3DField(
  1599.             gTestHiLevelDialog,
  1600.             kHiLevelItem_ListenerTranslate2,
  1601.             &data.listenerTranslate2,
  1602.             &data.listenerTranslateRange))
  1603.     {
  1604.         badItem = kHiLevelItem_ListenerTranslate2;
  1605.         goto bail;
  1606.     }
  1607.     
  1608.     if (!Utils_GetVector3DField(
  1609.             gTestHiLevelDialog,
  1610.             kHiLevelItem_ListenerRotationAxis1,
  1611.             &data.listenerRotationAxis1,
  1612.             NULL))
  1613.     {
  1614.         badItem = kHiLevelItem_ListenerRotationAxis1;
  1615.         goto bail;
  1616.     }
  1617.     
  1618.     if (!Utils_GetVector3DField(
  1619.             gTestHiLevelDialog,
  1620.             kHiLevelItem_ListenerRotationAxis2,
  1621.             &data.listenerRotationAxis2,
  1622.             &data.listenerRotationAxisRange))
  1623.     {
  1624.         badItem = kHiLevelItem_ListenerRotationAxis2;
  1625.         goto bail;
  1626.     }
  1627.     
  1628.     if (!Utils_GetFloatField(
  1629.             gTestHiLevelDialog,
  1630.             kHiLevelItem_ListenerRotationAngle1,
  1631.             &data.listenerRotationAngle1,
  1632.             NULL,
  1633.             -big,
  1634.             big))
  1635.     {
  1636.         badItem = kHiLevelItem_ListenerRotationAngle1;
  1637.         goto bail;
  1638.     }
  1639.     
  1640.     if (!Utils_GetFloatField(
  1641.             gTestHiLevelDialog,
  1642.             kHiLevelItem_ListenerRotationAngle2,
  1643.             &data.listenerRotationAngle2,
  1644.             &data.listenerRotationAngleRange,
  1645.             -big,
  1646.             big))
  1647.     {
  1648.         badItem = kHiLevelItem_ListenerRotationAngle2;
  1649.         goto bail;
  1650.     }
  1651.     
  1652.     if (!Utils_GetVector3DField(
  1653.             gTestHiLevelDialog,
  1654.             kHiLevelItem_ListenerScale1,
  1655.             &data.listenerScale1,
  1656.             NULL))
  1657.     {
  1658.         badItem = kHiLevelItem_ListenerScale1;
  1659.         goto bail;
  1660.     }
  1661.     
  1662.     if (!Utils_GetVector3DField(
  1663.             gTestHiLevelDialog,
  1664.             kHiLevelItem_ListenerScale2,
  1665.             &data.listenerScale2,
  1666.             &data.listenerScaleRange))
  1667.     {
  1668.         badItem = kHiLevelItem_ListenerScale2;
  1669.         goto bail;
  1670.     }
  1671.     
  1672.     if (!Utils_GetVector3DField(
  1673.             gTestHiLevelDialog,
  1674.             kHiLevelItem_ListenerPosition1,
  1675.             &data.listenerPosition1,
  1676.             NULL))
  1677.     {
  1678.         badItem = kHiLevelItem_ListenerPosition1;
  1679.         goto bail;
  1680.     }
  1681.     
  1682.     if (!Utils_GetVector3DField(
  1683.             gTestHiLevelDialog,
  1684.             kHiLevelItem_ListenerPosition2,
  1685.             &data.listenerPosition2,
  1686.             &data.listenerPositionRange))
  1687.     {
  1688.         badItem = kHiLevelItem_ListenerPosition2;
  1689.         goto bail;
  1690.     }
  1691.     
  1692.     if (!Utils_GetVector3DField(
  1693.             gTestHiLevelDialog,
  1694.             kHiLevelItem_ListenerOrientation1,
  1695.             &data.listenerOrientation1,
  1696.             NULL))
  1697.     {
  1698.         badItem = kHiLevelItem_ListenerOrientation1;
  1699.         goto bail;
  1700.     }
  1701.     
  1702.     if (!Utils_GetVector3DField(
  1703.             gTestHiLevelDialog,
  1704.             kHiLevelItem_ListenerOrientation2,
  1705.             &data.listenerOrientation2,
  1706.             &data.listenerOrientationRange))
  1707.     {
  1708.         badItem = kHiLevelItem_ListenerOrientation2;
  1709.         goto bail;
  1710.     }
  1711.     
  1712.     if (!Utils_GetVector3DField(
  1713.             gTestHiLevelDialog,
  1714.             kHiLevelItem_ListenerUpVector1,
  1715.             &data.listenerUpVector1,
  1716.             NULL))
  1717.     {
  1718.         badItem = kHiLevelItem_ListenerUpVector1;
  1719.         goto bail;
  1720.     }
  1721.     
  1722.     if (!Utils_GetVector3DField(
  1723.             gTestHiLevelDialog,
  1724.             kHiLevelItem_ListenerUpVector2,
  1725.             &data.listenerUpVector2,
  1726.             &data.listenerUpVectorRange))
  1727.     {
  1728.         badItem = kHiLevelItem_ListenerUpVector2;
  1729.         goto bail;
  1730.     }
  1731.     
  1732.     if (!Utils_GetVector3DField(
  1733.             gTestHiLevelDialog,
  1734.             kHiLevelItem_ListenerVelocity1,
  1735.             &data.listenerVelocity1,
  1736.             NULL))
  1737.     {
  1738.         badItem = kHiLevelItem_ListenerVelocity1;
  1739.         goto bail;
  1740.     }
  1741.     
  1742.     if (!Utils_GetVector3DField(
  1743.             gTestHiLevelDialog,
  1744.             kHiLevelItem_ListenerVelocity2,
  1745.             &data.listenerVelocity2,
  1746.             &data.listenerVelocityRange))
  1747.     {
  1748.         badItem = kHiLevelItem_ListenerVelocity2;
  1749.         goto bail;
  1750.     }
  1751.     
  1752.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_Medium, &itemType, &itemHandle, &itemBounds);
  1753.     switch (GetControlValue((ControlHandle) itemHandle))
  1754.     {
  1755.         case kMediumItem_Air:
  1756.             data.medium = kSSpMedium_Air;
  1757.         break;
  1758.         
  1759.         case kMediumItem_Water:
  1760.             data.medium = kSSpMedium_Water;
  1761.         break;
  1762.         
  1763.         default:
  1764.             assert(0);
  1765.     }
  1766.     
  1767.     if (!Utils_GetFloatField(
  1768.             gTestHiLevelDialog,
  1769.             kHiLevelItem_Humidity1,
  1770.             &data.humidity1,
  1771.             NULL,
  1772.             0.0,
  1773.             100.0))
  1774.     {
  1775.         badItem = kHiLevelItem_Humidity1;
  1776.         goto bail;
  1777.     }
  1778.     
  1779.     if (!Utils_GetFloatField(
  1780.             gTestHiLevelDialog,
  1781.             kHiLevelItem_Humidity2,
  1782.             &data.humidity2,
  1783.             &data.humidityRange,
  1784.             0.0,
  1785.             100.0))
  1786.     {
  1787.         badItem = kHiLevelItem_Humidity2;
  1788.         goto bail;
  1789.     }
  1790.     
  1791.     if (!Utils_GetFloatField(
  1792.             gTestHiLevelDialog,
  1793.             kHiLevelItem_RoomSize1,
  1794.             &data.roomSize1,
  1795.             NULL,
  1796.             0.0,
  1797.             big))
  1798.     {
  1799.         badItem = kHiLevelItem_RoomSize1;
  1800.         goto bail;
  1801.     }
  1802.     
  1803.     if (!Utils_GetFloatField(
  1804.             gTestHiLevelDialog,
  1805.             kHiLevelItem_RoomSize2,
  1806.             &data.roomSize2,
  1807.             &data.roomSizeRange,
  1808.             0.0,
  1809.             big))
  1810.     {
  1811.         badItem = kHiLevelItem_RoomSize2;
  1812.         goto bail;
  1813.     }
  1814.     
  1815.     if (!Utils_GetFloatField(
  1816.             gTestHiLevelDialog,
  1817.             kHiLevelItem_RoomReflectivity1,
  1818.             &data.roomReflectivity1,
  1819.             NULL,
  1820.             -big,
  1821.             -small))
  1822.     {
  1823.         badItem = kHiLevelItem_RoomReflectivity1;
  1824.         goto bail;
  1825.     }
  1826.     
  1827.     if (!Utils_GetFloatField(
  1828.             gTestHiLevelDialog,
  1829.             kHiLevelItem_RoomReflectivity2,
  1830.             &data.roomReflectivity2,
  1831.             &data.roomReflectivityRange,
  1832.             -big,
  1833.             -small))
  1834.     {
  1835.         badItem = kHiLevelItem_RoomReflectivity2;
  1836.         goto bail;
  1837.     }
  1838.     
  1839.     if (!Utils_GetFloatField(
  1840.             gTestHiLevelDialog,
  1841.             kHiLevelItem_ReverbAttenuation1,
  1842.             &data.reverbAttenuation1,
  1843.             NULL,
  1844.             -big,
  1845.             big))
  1846.     {
  1847.         badItem = kHiLevelItem_ReverbAttenuation1;
  1848.         goto bail;
  1849.     }
  1850.     
  1851.     if (!Utils_GetFloatField(
  1852.             gTestHiLevelDialog,
  1853.             kHiLevelItem_ReverbAttenuation2,
  1854.             &data.reverbAttenuation2,
  1855.             &data.reverbAttenuationRange,
  1856.             -big,
  1857.             big))
  1858.     {
  1859.         badItem = kHiLevelItem_ReverbAttenuation2;
  1860.         goto bail;
  1861.     }
  1862.     
  1863.     if (!Utils_GetUInt32Field(
  1864.             gTestHiLevelDialog,
  1865.             kHiLevelItem_CPULoad1,
  1866.             &data.cpuLoad1,
  1867.             NULL,
  1868.             0,
  1869.             gTestHiLevelCPULoadLimit))
  1870.     {
  1871.         badItem = kHiLevelItem_CPULoad1;
  1872.         goto bail;
  1873.     }
  1874.     
  1875.     if (!Utils_GetUInt32Field(
  1876.             gTestHiLevelDialog,
  1877.             kHiLevelItem_CPULoad2,
  1878.             &data.cpuLoad2,
  1879.             &data.cpuLoadRange,
  1880.             0,
  1881.             gTestHiLevelCPULoadLimit))
  1882.     {
  1883.         badItem = kHiLevelItem_CPULoad2;
  1884.         goto bail;
  1885.     }
  1886.     
  1887.     if (!Utils_GetVector3DField(
  1888.             gTestHiLevelDialog,
  1889.             kHiLevelItem_SourceTranslate1,
  1890.             &data.sourceTranslate1,
  1891.             NULL))
  1892.     {
  1893.         badItem = kHiLevelItem_SourceTranslate1;
  1894.         goto bail;
  1895.     }
  1896.     
  1897.     if (!Utils_GetVector3DField(
  1898.             gTestHiLevelDialog,
  1899.             kHiLevelItem_SourceTranslate2,
  1900.             &data.sourceTranslate2,
  1901.             &data.sourceTranslateRange))
  1902.     {
  1903.         badItem = kHiLevelItem_SourceTranslate2;
  1904.         goto bail;
  1905.     }
  1906.     
  1907.     if (!Utils_GetVector3DField(
  1908.             gTestHiLevelDialog,
  1909.             kHiLevelItem_SourceRotationAxis1,
  1910.             &data.sourceRotationAxis1,
  1911.             NULL))
  1912.     {
  1913.         badItem = kHiLevelItem_SourceRotationAxis1;
  1914.         goto bail;
  1915.     }
  1916.     
  1917.     if (!Utils_GetVector3DField(
  1918.             gTestHiLevelDialog,
  1919.             kHiLevelItem_SourceRotationAxis2,
  1920.             &data.sourceRotationAxis2,
  1921.             &data.sourceRotationAxisRange))
  1922.     {
  1923.         badItem = kHiLevelItem_SourceRotationAxis2;
  1924.         goto bail;
  1925.     }
  1926.     
  1927.     if (!Utils_GetFloatField(
  1928.             gTestHiLevelDialog,
  1929.             kHiLevelItem_SourceRotationAngle1,
  1930.             &data.sourceRotationAngle1,
  1931.             NULL,
  1932.             -big,
  1933.             big))
  1934.     {
  1935.         badItem = kHiLevelItem_SourceRotationAngle1;
  1936.         goto bail;
  1937.     }
  1938.     
  1939.     if (!Utils_GetFloatField(
  1940.             gTestHiLevelDialog,
  1941.             kHiLevelItem_SourceRotationAngle2,
  1942.             &data.sourceRotationAngle2,
  1943.             &data.sourceRotationAngleRange,
  1944.             -big,
  1945.             big))
  1946.     {
  1947.         badItem = kHiLevelItem_SourceRotationAngle2;
  1948.         goto bail;
  1949.     }
  1950.     
  1951.     if (!Utils_GetVector3DField(
  1952.             gTestHiLevelDialog,
  1953.             kHiLevelItem_SourceScale1,
  1954.             &data.sourceScale1,
  1955.             NULL))
  1956.     {
  1957.         badItem = kHiLevelItem_SourceScale1;
  1958.         goto bail;
  1959.     }
  1960.     
  1961.     if (!Utils_GetVector3DField(
  1962.             gTestHiLevelDialog,
  1963.             kHiLevelItem_SourceScale2,
  1964.             &data.sourceScale2,
  1965.             &data.sourceScaleRange))
  1966.     {
  1967.         badItem = kHiLevelItem_SourceScale2;
  1968.         goto bail;
  1969.     }
  1970.     
  1971.     if (!Utils_GetVector3DField(
  1972.             gTestHiLevelDialog,
  1973.             kHiLevelItem_SourcePosition1,
  1974.             &data.sourcePosition1,
  1975.             NULL))
  1976.     {
  1977.         badItem = kHiLevelItem_SourcePosition1;
  1978.         goto bail;
  1979.     }
  1980.     
  1981.     if (!Utils_GetVector3DField(
  1982.             gTestHiLevelDialog,
  1983.             kHiLevelItem_SourcePosition2,
  1984.             &data.sourcePosition2,
  1985.             &data.sourcePositionRange))
  1986.     {
  1987.         badItem = kHiLevelItem_SourcePosition2;
  1988.         goto bail;
  1989.     }
  1990.     
  1991.     if (!Utils_GetVector3DField(
  1992.             gTestHiLevelDialog,
  1993.             kHiLevelItem_SourceOrientation1,
  1994.             &data.sourceOrientation1,
  1995.             NULL))
  1996.     {
  1997.         badItem = kHiLevelItem_SourceOrientation1;
  1998.         goto bail;
  1999.     }
  2000.     
  2001.     if (!Utils_GetVector3DField(
  2002.             gTestHiLevelDialog,
  2003.             kHiLevelItem_SourceOrientation2,
  2004.             &data.sourceOrientation2,
  2005.             &data.sourceOrientationRange))
  2006.     {
  2007.         badItem = kHiLevelItem_SourceOrientation2;
  2008.         goto bail;
  2009.     }
  2010.     
  2011.     if (!Utils_GetVector3DField(
  2012.             gTestHiLevelDialog,
  2013.             kHiLevelItem_SourceUpVector1,
  2014.             &data.sourceUpVector1,
  2015.             NULL))
  2016.     {
  2017.         badItem = kHiLevelItem_SourceUpVector1;
  2018.         goto bail;
  2019.     }
  2020.     
  2021.     if (!Utils_GetVector3DField(
  2022.             gTestHiLevelDialog,
  2023.             kHiLevelItem_SourceUpVector2,
  2024.             &data.sourceUpVector2,
  2025.             &data.sourceUpVectorRange))
  2026.     {
  2027.         badItem = kHiLevelItem_SourceUpVector2;
  2028.         goto bail;
  2029.     }
  2030.     
  2031.     if (!Utils_GetVector3DField(
  2032.             gTestHiLevelDialog,
  2033.             kHiLevelItem_SourceVelocity1,
  2034.             &data.sourceVelocity1,
  2035.             NULL))
  2036.     {
  2037.         badItem = kHiLevelItem_SourceVelocity1;
  2038.         goto bail;
  2039.     }
  2040.     
  2041.     if (!Utils_GetVector3DField(
  2042.             gTestHiLevelDialog,
  2043.             kHiLevelItem_SourceVelocity2,
  2044.             &data.sourceVelocity2,
  2045.             &data.sourceVelocityRange))
  2046.     {
  2047.         badItem = kHiLevelItem_SourceVelocity2;
  2048.         goto bail;
  2049.     }
  2050.     
  2051.     GetDialogItem(gTestHiLevelDialog, kHiLevelItem_SourceMode, &itemType, &itemHandle, &itemBounds);
  2052.     switch (GetControlValue((ControlHandle) itemHandle))
  2053.     {
  2054.         case kSourceModeItem_Unfiltered:
  2055.             data.sourceMode = kSSpSourceMode_Unfiltered;
  2056.         break;
  2057.         
  2058.         case kSourceModeItem_Localized:
  2059.             data.sourceMode = kSSpSourceMode_Localized;
  2060.         break;
  2061.         
  2062.         case kSourceModeItem_Ambient:
  2063.             data.sourceMode = kSSpSourceMode_Ambient;
  2064.         break;
  2065.         
  2066.         case kSourceModeItem_Binaural:
  2067.             data.sourceMode = kSSpSourceMode_Binaural;
  2068.         break;
  2069.         
  2070.         default:
  2071.             assert(0);
  2072.     }
  2073.     
  2074.     if (!Utils_GetFloatField(
  2075.             gTestHiLevelDialog,
  2076.             kHiLevelItem_ReferenceDistance1,
  2077.             &data.referenceDistance1,
  2078.             NULL,
  2079.             small,
  2080.             big))
  2081.     {
  2082.         badItem = kHiLevelItem_ReferenceDistance1;
  2083.         goto bail;
  2084.     }
  2085.     
  2086.     if (!Utils_GetFloatField(
  2087.             gTestHiLevelDialog,
  2088.             kHiLevelItem_ReferenceDistance2,
  2089.             &data.referenceDistance2,
  2090.             &data.referenceDistanceRange,
  2091.             small,
  2092.             big))
  2093.     {
  2094.         badItem = kHiLevelItem_ReferenceDistance2;
  2095.         goto bail;
  2096.     }
  2097.     
  2098.     if (!Utils_GetFloatField(
  2099.             gTestHiLevelDialog,
  2100.             kHiLevelItem_Length1,
  2101.             &data.length1,
  2102.             NULL,
  2103.             -big,
  2104.             0.0))
  2105.     {
  2106.         badItem = kHiLevelItem_Length1;
  2107.         goto bail;
  2108.     }
  2109.     
  2110.     if (!Utils_GetFloatField(
  2111.             gTestHiLevelDialog,
  2112.             kHiLevelItem_Length2,
  2113.             &data.length2,
  2114.             &data.lengthRange,
  2115.             0.0,
  2116.             big))
  2117.     {
  2118.         badItem = kHiLevelItem_Length2;
  2119.         goto bail;
  2120.     }
  2121.     
  2122.     if (!Utils_GetFloatField(
  2123.             gTestHiLevelDialog,
  2124.             kHiLevelItem_Width1,
  2125.             &data.width1,
  2126.             NULL,
  2127.             0.0,
  2128.             big))
  2129.     {
  2130.         badItem = kHiLevelItem_Width1;
  2131.         goto bail;
  2132.     }
  2133.     
  2134.     if (!Utils_GetFloatField(
  2135.             gTestHiLevelDialog,
  2136.             kHiLevelItem_Width2,
  2137.             &data.width2,
  2138.             &data.widthRange,
  2139.             0.0,
  2140.             big))
  2141.     {
  2142.         badItem = kHiLevelItem_Width2;
  2143.         goto bail;
  2144.     }
  2145.     
  2146.     if (!Utils_GetFloatField(
  2147.             gTestHiLevelDialog,
  2148.             kHiLevelItem_Height1,
  2149.             &data.height1,
  2150.             NULL,
  2151.             0.0,
  2152.             big))
  2153.     {
  2154.         badItem = kHiLevelItem_Height1;
  2155.         goto bail;
  2156.     }
  2157.     
  2158.     if (!Utils_GetFloatField(
  2159.             gTestHiLevelDialog,
  2160.             kHiLevelItem_Height2,
  2161.             &data.height2,
  2162.             &data.heightRange,
  2163.             0.0,
  2164.             big))
  2165.     {
  2166.         badItem = kHiLevelItem_Height2;
  2167.         goto bail;
  2168.     }
  2169.     
  2170.     if (!Utils_GetFloatField(
  2171.             gTestHiLevelDialog,
  2172.             kHiLevelItem_ConeAngleDeg1,
  2173.             &data.coneAngleDeg1,
  2174.             NULL,
  2175.             0.0,
  2176.             360.0))
  2177.     {
  2178.         badItem = kHiLevelItem_ConeAngleDeg1;
  2179.         goto bail;
  2180.     }
  2181.     
  2182.     if (!Utils_GetFloatField(
  2183.             gTestHiLevelDialog,
  2184.             kHiLevelItem_ConeAngleDeg2,
  2185.             &data.coneAngleDeg2,
  2186.             &data.coneAngleDegRange,
  2187.             0.0,
  2188.             360.0))
  2189.     {
  2190.         badItem = kHiLevelItem_ConeAngleDeg2;
  2191.         goto bail;
  2192.     }
  2193.     
  2194.     if (!Utils_GetFloatField(
  2195.             gTestHiLevelDialog,
  2196.             kHiLevelItem_ConeAttenuation1,
  2197.             &data.coneAttenuation1,
  2198.             NULL,
  2199.             -big,
  2200.             big))
  2201.     {
  2202.         badItem = kHiLevelItem_ConeAttenuation1;
  2203.         goto bail;
  2204.     }
  2205.     
  2206.     if (!Utils_GetFloatField(
  2207.             gTestHiLevelDialog,
  2208.             kHiLevelItem_ConeAttenuation2,
  2209.             &data.coneAttenuation2,
  2210.             &data.coneAttenuationRange,
  2211.             -big,
  2212.             big))
  2213.     {
  2214.         badItem = kHiLevelItem_ConeAttenuation2;
  2215.         goto bail;
  2216.     }
  2217.     
  2218.     // All fields are good -- finish up
  2219.     gTestHiLevelData = data;
  2220.     TestHiLevel_DeriveData();
  2221.     
  2222.     TestHiLevel_SetDialogFields();
  2223.     
  2224.     gTestHiLevelUpdate = true;
  2225.     
  2226.     return;
  2227.     
  2228.     // Error exit
  2229. bail:
  2230.     SelectDialogItemText(gTestHiLevelDialog, badItem, 0, 32767);
  2231.     StopAlert(kAlrtID_BadField, NULL);
  2232. }
  2233.  
  2234.  
  2235. /* =============================================================================
  2236.  *        TestHiLevel_Preset (external)
  2237.  *
  2238.  *    Updates the fields to the chosen preset value.
  2239.  * ========================================================================== */
  2240. void TestHiLevel_Preset(
  2241.     UInt32            index)
  2242. {
  2243.     TTestHiLevelData preset[] = {
  2244.         { /* nothing for index zero */ 0 },
  2245.         { /* Left-Right Ahead */
  2246.                 /* duration                    */    4.0,
  2247.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2248.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2249.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2250.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2251.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2252.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2253.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2254.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2255.                 /* medium                    */    kSSpMedium_Air,
  2256.                 /* humidity                    */    0.0, 0.0, false,
  2257.                 /* roomSize                    */    0.0, 0.0, false,
  2258.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2259.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2260.                 /* cpuLoad                    */    0, 0, false,
  2261.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2262.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2263.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2264.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2265.                 /* sourcePosition            */    {1.0, 0.0, -10.0}, {1.0, 0.0, 10.0}, true,
  2266.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2267.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2268.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2269.                 /* medium                    */    kSSpSourceMode_Localized,
  2270.                 /* referenceDistance        */    1.0, 0.0, false,
  2271.                 /* length                    */    0.0, 0.0, false,
  2272.                 /* width                    */    0.0, 0.0, false,
  2273.                 /* height                    */    0.0, 0.0, false,
  2274.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2275.                 /* coneAttenuation            */    0.0, 0.0, false
  2276.         },
  2277.         { /* Front-Back Above */
  2278.                 /* duration                    */    4.0,
  2279.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2280.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2281.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2282.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2283.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2284.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2285.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2286.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2287.                 /* medium                    */    kSSpMedium_Air,
  2288.                 /* humidity                    */    0.0, 0.0, false,
  2289.                 /* roomSize                    */    0.0, 0.0, false,
  2290.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2291.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2292.                 /* cpuLoad                    */    0, 0, false,
  2293.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2294.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2295.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2296.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2297.                 /* sourcePosition            */    {10.0, 1.0, 0.0}, {-10.0, 1.0, 0.0}, true,
  2298.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2299.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2300.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2301.                 /* medium                    */    kSSpSourceMode_Localized,
  2302.                 /* referenceDistance        */    1.0, 0.0, false,
  2303.                 /* length                    */    0.0, 0.0, false,
  2304.                 /* width                    */    0.0, 0.0, false,
  2305.                 /* height                    */    0.0, 0.0, false,
  2306.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2307.                 /* coneAttenuation            */    0.0, 0.0, false
  2308.         },
  2309.         { /* Up-Down Ahead */
  2310.                 /* duration                    */    4.0,
  2311.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2312.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2313.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2314.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2315.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2316.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2317.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2318.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2319.                 /* medium                    */    kSSpMedium_Air,
  2320.                 /* humidity                    */    0.0, 0.0, false,
  2321.                 /* roomSize                    */    0.0, 0.0, false,
  2322.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2323.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2324.                 /* cpuLoad                    */    0, 0, false,
  2325.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2326.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2327.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2328.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2329.                 /* sourcePosition            */    {1.0, -10.0, 0.0}, {1.0, 10.0, 0.0}, true,
  2330.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2331.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2332.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2333.                 /* medium                    */    kSSpSourceMode_Localized,
  2334.                 /* referenceDistance        */    1.0, 0.0, false,
  2335.                 /* length                    */    0.0, 0.0, false,
  2336.                 /* width                    */    0.0, 0.0, false,
  2337.                 /* height                    */    0.0, 0.0, false,
  2338.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2339.                 /* coneAttenuation            */    0.0, 0.0, false
  2340.         },
  2341.         { /* dividing line */ 0 },
  2342.         { /* Reverb — Living Room */
  2343.                 /* duration                    */    4.0,
  2344.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2345.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2346.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2347.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2348.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2349.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2350.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2351.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2352.                 /* medium                    */    kSSpMedium_Air,
  2353.                 /* humidity                    */    0.0, 0.0, false,
  2354.                 /* roomSize                    */    10.0, 0.0, false,
  2355.                 /* roomReflectivity            */    -20.0, 0.0, false,
  2356.                 /* reverbAttenuation        */    0.0, 0.0, false,
  2357.                 /* cpuLoad                    */    0, 0, false,
  2358.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2359.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2360.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2361.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2362.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2363.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2364.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2365.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2366.                 /* medium                    */    kSSpSourceMode_Localized,
  2367.                 /* referenceDistance        */    1.0, 0.0, false,
  2368.                 /* length                    */    0.0, 0.0, false,
  2369.                 /* width                    */    0.0, 0.0, false,
  2370.                 /* height                    */    0.0, 0.0, false,
  2371.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2372.                 /* coneAttenuation            */    0.0, 0.0, false
  2373.         },
  2374.         { /* Reverb — Cave */
  2375.                 /* duration                    */    4.0,
  2376.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2377.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2378.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2379.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2380.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2381.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2382.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2383.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2384.                 /* medium                    */    kSSpMedium_Air,
  2385.                 /* humidity                    */    0.0, 0.0, false,
  2386.                 /* roomSize                    */    100.0, 0.0, false,
  2387.                 /* roomReflectivity            */    -40.0, 0.0, false,
  2388.                 /* reverbAttenuation        */    20.0, 0.0, false,
  2389.                 /* cpuLoad                    */    0, 0, false,
  2390.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2391.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2392.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2393.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2394.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2395.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2396.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2397.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2398.                 /* medium                    */    kSSpSourceMode_Localized,
  2399.                 /* referenceDistance        */    1.0, 0.0, false,
  2400.                 /* length                    */    0.0, 0.0, false,
  2401.                 /* width                    */    0.0, 0.0, false,
  2402.                 /* height                    */    0.0, 0.0, false,
  2403.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2404.                 /* coneAttenuation            */    0.0, 0.0, false
  2405.         },
  2406.         { /* Reverb — Stadium */
  2407.                 /* duration                    */    4.0,
  2408.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2409.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2410.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2411.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2412.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2413.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2414.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2415.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2416.                 /* medium                    */    kSSpMedium_Air,
  2417.                 /* humidity                    */    0.0, 0.0, false,
  2418.                 /* roomSize                    */    250.0, 0.0, false,
  2419.                 /* roomReflectivity            */    -15.0, 0.0, false,
  2420.                 /* reverbAttenuation        */    -5.0, 0.0, false,
  2421.                 /* cpuLoad                    */    0, 0, false,
  2422.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2423.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2424.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2425.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2426.                 /* sourcePosition            */    {2.0, 0.0, 0.0}, {10.0, 0.0, 0.0}, true,
  2427.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2428.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2429.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2430.                 /* medium                    */    kSSpSourceMode_Localized,
  2431.                 /* referenceDistance        */    1.0, 0.0, false,
  2432.                 /* length                    */    0.0, 0.0, false,
  2433.                 /* width                    */    0.0, 0.0, false,
  2434.                 /* height                    */    0.0, 0.0, false,
  2435.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2436.                 /* coneAttenuation            */    0.0, 0.0, false
  2437.         },
  2438.         { /* dividing line */ 0 },
  2439.         { /* Searchlight */
  2440.                 /* duration                    */    4.0,
  2441.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2442.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2443.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2444.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2445.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2446.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2447.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2448.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2449.                 /* medium                    */    kSSpMedium_Air,
  2450.                 /* humidity                    */    0.0, 0.0, false,
  2451.                 /* roomSize                    */    0.0, 0.0, false,
  2452.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2453.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2454.                 /* cpuLoad                    */    0, 0, false,
  2455.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2456.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2457.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2458.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2459.                 /* sourcePosition            */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2460.                 /* sourceOrientation        */    {-0.1, 0.0, -1.0}, {-0.1, 0.0, 1.0}, true,
  2461.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2462.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2463.                 /* medium                    */    kSSpSourceMode_Localized,
  2464.                 /* referenceDistance        */    1.0, 0.0, false,
  2465.                 /* length                    */    0.0, 0.0, false,
  2466.                 /* width                    */    0.0, 0.0, false,
  2467.                 /* height                    */    0.0, 0.0, false,
  2468.                 /* coneAngleDeg                */    180.0, 0.0, false,
  2469.                 /* coneAttenuation            */    -20.0, 0.0, false
  2470.         },
  2471.         { /* dividing line */ 0 },
  2472.         { /* Box Left-Right Ahead */
  2473.                 /* duration                    */    4.0,
  2474.                 /* listenerTranslate        */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2475.                 /* listenerRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2476.                 /* listenerRotationAngle    */    0.0, 0.0, false,
  2477.                 /* listenerScale            */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2478.                 /* listenerPosition            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2479.                 /* listenerOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2480.                 /* listenerUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2481.                 /* listenerVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2482.                 /* medium                    */    kSSpMedium_Air,
  2483.                 /* humidity                    */    0.0, 0.0, false,
  2484.                 /* roomSize                    */    0.0, 0.0, false,
  2485.                 /* roomReflectivity            */    -10.0, 0.0, false,
  2486.                 /* reverbAttenuation        */    -15.0, 0.0, false,
  2487.                 /* cpuLoad                    */    0, 0, false,
  2488.                 /* sourceTranslate            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2489.                 /* sourceRotationAxis        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2490.                 /* sourceRotationAngle        */    0.0, 0.0, false,
  2491.                 /* sourceScale                */    {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, false,
  2492.                 /* sourcePosition            */    {2.0, 0.0, -10.0}, {2.0, 0.0, 10.0}, true,
  2493.                 /* sourceOrientation        */    {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2494.                 /* sourceUpVector            */    {0.0, 1.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2495.                 /* sourceVelocity            */    {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0}, false,
  2496.                 /* medium                    */    kSSpSourceMode_Localized,
  2497.                 /* referenceDistance        */    1.0, 0.0, false,
  2498.                 /* length                    */    1.0, 0.0, false,
  2499.                 /* width                    */    1.0, 0.0, false,
  2500.                 /* height                    */    1.0, 0.0, false,
  2501.                 /* coneAngleDeg                */    0.0, 0.0, false,
  2502.                 /* coneAttenuation            */    0.0, 0.0, false
  2503.         },
  2504.     };
  2505.     
  2506.     gTestHiLevelData = preset[index];
  2507.     
  2508.     TestHiLevel_DeriveData();
  2509.     TestHiLevel_SetDialogFields();
  2510.     
  2511.     gTestHiLevelUpdate = true;
  2512. }
  2513.  
  2514.  
  2515.